package cn.com.bonc.khjy.utils;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created by hanbing on 2019/6/14.
 */
public class FtpUploadUtil {

/*public static void main(String[] args){
    FtpUploadUtil fu=new FtpUploadUtil();
    try {
        fu.uploadFile("192.168.1.105",21,"hanbing","sasa123.123","C:\\TEMP\\ftpwork","C:\\TEMP\\PrismX\\src\\test\\package-info.java");
    } catch (IOException e) {
        e.printStackTrace();
    }
}*/

    /**
     * uploadFile
     * @param ip FTP服务器hostname
     * @param port FTP服务器端口
     * @param username FTP登录账号
     * @param password FTP登录密码
     * @param uploadDir FTP服务器文件存放路径，如果不存在会自动创建
     * @param filePath 上传到FTP服务器上的文件名
     * @return
     * @throws IOException
     */
    public   boolean uploadFile(String ip, int port, String username, String password, String uploadDir, String filePath)throws IOException {
        try {
            File file = new File(filePath);
            FileInputStream in=new FileInputStream(file);
            boolean b = uploadFile(ip, port, username, password, uploadDir, file.getName(), in);
            in.close();
            return b;
        } catch (IOException e) {
            throw e;
        }
    }

    /**
     * Description: 向FTP服务器上传文件
     * @param host FTP服务器hostname
     * @param port FTP服务器端口
     * @param username FTP登录账号
     * @param password FTP登录密码
     * @param path FTP服务器文件存放路径，如果不存在会自动创建
     * @param filename 上传到FTP服务器上的文件名
     * @param input 输入流
     * @return 成功返回true，否则返回false
     */
    private   boolean uploadFile(String host, int port, String username, String password, String path, String filename, InputStream input)throws  IOException{
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {


            int reply;
            ftp.connect(host, port);// 连接FTP服务器
            // ftp.enterLocalActiveMode();//主动模式
             ftp.enterLocalPassiveMode();//被动模式
            // 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器
            ftp.login(username, password);// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            //切换到上传目录
            if (!ftp.changeWorkingDirectory(path)) {
                //如果目录不存在创建目录
                String[] dirs = path.split("/");
                StringBuilder bld = new StringBuilder();
                createCdDir( ftp, dirs, bld);
            }
            //设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            //上传文件
            if (!ftp.storeFile(new String(filename.getBytes("GBK"),"iso-8859-1"), input)) {
                return result;
            }
            input.close();
            ftp.logout();
            result = true;
        } catch (IOException e) {
            throw e;
        } finally {
            if (ftp.isConnected()) {
                ftp.disconnect();
            }
        }
        return result;
    }

    private   void createCdDir(  FTPClient ftp, String[] dirs , StringBuilder bld) throws IOException {
        for (String dir : dirs) {


            bld.append("/"+dir);

            if (!ftp.changeWorkingDirectory(bld.toString())) {  //进不去目录，说明该目录不存在
                if (!ftp.makeDirectory(bld.toString())) { //创建目录

                } else {
                    //目录存在，则直接进入该目录
                    ftp.changeWorkingDirectory(bld.toString());
                }
            }
        }


    }

}
